#include <choix_ville.h>

void	choix_ville(t_SOMMET ville, t_FOURMI *fourmi, int nb_villes, double alpha, double beta, double *cout_chemin)
{
	int		j ;
	int		*tabuk ;
	double	fx ;
	double	tirage ;
	double	cumul_proba ;
	Liste	browse ;
	browse = creer_liste() ;

	/*DEBUG :*/
	/*printf ("\n\n-------------------------------------------------\n\n") ;
	printf("Choix de la %dème ville de la fourmi se trouvant actuellement dans la ville %d\n\n",enieme_ville + 1, fourmi->ville_courante) ;*/
	
	j = 0 ;
	cumul_proba = 0 ;
	fx = 0 ;
	tirage = (double)rand() / (double)(RAND_MAX - 1) ;
	/*DEBUG :*/
	/*printf ("\nTirage = %lf\n\n", tirage) ;*/
	
	/*Calcul de cumul_proba*/
	while(j < nb_villes)
	{
		tabuk = fourmi->tabuk ;
		if(tabuk[j] == -1)/*On entre si la ville j n'a pas été visitée : j n'appartient pas à tabuk*/
		{
			browse = ville.voisins ;
			while (browse->element->arrivee != j && !est_vide(browse->next))
			{
				browse = browse->next ;
			}
			cumul_proba = cumul_proba + (pow(browse->element->pheromones, alpha) * pow(1.0 / (browse->element->distance), beta)) ;
		}
		j++ ;
	}
	j = 0 ;
	/*Calcul de fx*/
	tabuk = fourmi->tabuk ;
	while(j < nb_villes)
	{
		if(tabuk[j] == -1)/*On entre si j n'appartient pas à tabuk*/
		{
			browse = ville.voisins ;
			while (browse->element->arrivee != j && !est_vide(browse->next))
			{
				browse = browse->next ;
			}
			fx = fx + (pow(browse->element->pheromones, alpha) * pow(1.0 / browse->element->distance, beta) / cumul_proba) ;
			/*DEBUG :*/
			/*printf("Cumul_proba : %lf\nPhéromones : %lf\nDistance : %lf\nVisibilité : %lf\n", cumul_proba, browse->element->pheromones, browse->element->distance, 1.0 / browse->element->distance) ;
			printf ("fx = %lf\n\n", fx) ;*/
			
			/*MAJ des champs de fourmi et de cout_chemin*/
			if (tirage <= fx)
			{
				*cout_chemin = *cout_chemin + browse->element->distance ;
				fourmi->tabuk[j] = j ;
				fourmi->solution = enfiler (browse->element, fourmi->solution) ;
				fourmi->ville_courante = j ;
				/*DEBUG :*/
				/*printf ("Nouvelle ville = %d\n", j) ;
				printf ("\nSolution :\n") ;
				visualiser_file(fourmi->solution) ;*/
				break ;
			}
		}
		j++ ;
	}
}
